﻿using DevExpress.XtraBars;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Repository;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using eFatura.Properties;
using eFatura.Utility;
using eFatura.Utility.Grid;
using Extensions;
using Pechkin;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Printing;
using System.IO;
using System.Net;
using System.Text;
using System.Windows.Forms;

namespace eFatura
{
    public partial class GelenFatura : XForm
    {
        List<int> ModifiedRows = new List<int>();

        DataTable dtMasrafMerkezi;
        string FaturaDurum;
        public GelenFatura(string faturaDurum)
        {
            InitializeComponent();
            FaturaDurum = faturaDurum;
        }

        Fatura fatura = new Fatura();
        DataSet ds = null;

        private void Faturalar_Load(object sender, EventArgs e)
        {
            ZorunluRenk = Color.PeachPuff;
            HizmetFaturasiRengi = Color.PeachPuff;

            ShowOnlyBar();

            this.Text = "Gelen Fatura (" + FaturaDurum + ")";
            dtBitis.EditValue = DateTime.Now;
            dtBaslangic.EditValue = DateTime.Now.AddMonths(-1);

            bbiSorgula.Enabled = isYonetici;

            ds = AppSession.DataManager.ExecuteDataSet(Schema + "GetGelenEFatura", AppSession.UserInfo.UserId, SirketId, dtBaslangic.EditValue, dtBitis.EditValue);


            gvMaster.Init(ds.Tables[0]);
            if (SirketId == 1) // || SirketId == 2)
            {
                gvMaster.MakeColumnInvisible("HizmetFaturasi");
            }

            if (SirketId == 4 || SirketId == 5)
                gvMaster.MakeColumnInvisible("MasrafMerkezi");

            if (SirketId != 4)
                gvMaster.MakeColumnInvisible("Proje");

            gvMaster.AddDetailGrid(gvDetail, "PayFlexId");
            RefreshFilter(ds.Tables[0]);
            dtMasrafMerkezi = ds.Tables[2];

            gvMaster.Columns["nFirmaId"].ColumnEdit = RepositoryManager.Firma;
            gvMaster.Columns["FaturaOnay"].ColumnEdit = RepositoryManager.FaturaOnay;
            gvMaster.Columns["ResponseStatus"].ColumnEdit = RepositoryManager.FaturaOnayCevabi;


            gvMaster.Columns["FaturaTipi"].ColumnEdit = RepositoryManager.FaturaTipi;



            gvMaster.Columns["ProfileId"].ColumnEdit = RepositoryManager.Senaryo;
            gvMaster.Columns["Cevap"].ColumnEdit = RepositoryManager.Cevap;
            gvMaster.Columns["SirketId"].ColumnEdit = RepositoryManager.Sirket;

            gvDetail.Columns["nStokId"].ColumnEdit = RepositoryManager.Stok;

            RepositoryItemGridLookUpEdit gleNumune = RepositoryManager.GetCustomRI("DovizCinsi", false, "EUR", "USD", "GBP", "CHF");
            gvMaster.Columns["DovizCinsi"].ColumnEdit = gleNumune;


            gvMaster.SetAlternateRowStyle(false);
            gvDetail.SetAlternateRowStyle(false);

            gvMaster.MakeColumnInvisible("GelenEFaturaId", "SirketId", "URL", "nStokFisiId", "RequestNumber", "PayFlexId", "ResponseDescription", "Yeni", "CurrencyRevisable");
            gvDetail.MakeColumnInvisible("GelenEFaturaLinesId", "GelenEFaturaId", "PayFlexId");

            gvMaster.MakeReadOnly("nFirmaId");
            gvDetail.MakeReadOnly("nStokId");

            gvMaster.FormatAsNumber(2, "Matrah", "KDVTutari", "Tutar", "OdenecekTutar", "Iskonto", "Arttirim", "Yuvarlama");
            gvDetail.FormatAsNumber(2, "Miktar", "KDVTutari", "BirimFiyat", "MalHizmetTutari", "Iskonto", "Arttirim");

            gvMaster.AddSummary("Matrah", "KDVTutari", "Tutar", "OdenecekTutar", "Iskonto", "Arttirim", "Yuvarlama");
            gvDetail.AddSummary("Miktar", "KDVTutari", "MalHizmetTutari");

            gvDetail.FormatAsNumber(0, "KDVOrani");


            gvMaster.SetCaptions("HizmetFaturasi:Hizmet Faturası", "PayFlexAlinanTarih:PayFlex'e Aktarım", "NebimeAktarilma:Nebim'e Aktarım",
                                 "Gonderen:Gönderen", "GonderenVKNTipi:Gönderen VKN Tipi", "nFirmaId:Nebim Firma", "Cevap:Kurumiçi Onay",
                                 "ProfileId:Senaryo", "ResponseStatus:Ticari Onay Yanıtı", "FaturaOnay:Ticari Onay", "GonderenAdres:Gönderen Adres",
                                 "eFaturaNo:e-Fatura No", "AsilMi:Asıl Mı?", "KDVTutari:KDVTutarı", "Iskonto:İskonto", "Arttirim:Arttırım",
                                 "OdenecekTutar:Ödenecek Tutar", "DovizKuru:Döviz Kuru", "KayitTarihi:Kayıt Tarihi");

            gvDetail.SetCaptions("nStokId:Nebim Stok Kartı", "Iskonto:İskonto", "Arttirim:Arttırım", "KDVOrani:KDV Oranı", "KDVTutari:KDV", "MalHizmetTutari:Tutar");

            GridManager gm = GridManager.GetManager(gvMaster);

            //gm.GridMenu.AddMenu("Excel'e Aktar", ExceleAktar, Resources.feature_16x16);


            if (isYonetici || WhoAmI == 34)
            {
                gm.GridMenu.AddMenu("(Ticari) Onayla", FaturaOnayla, Resources.apply_16x16);
                gm.GridMenu.AddMenu("(Ticari) Reddet", FaturaReddet, Resources.cancel_16x16);
                gm.GridMenu.AddMenu("Nebim'e Aktar", NebimeAktar, Resources.addfooter_16x16, true);
                if (isYonetici)
                    gm.GridMenu.AddMenu("Sorumlu Ata", SorumluAta, Resources.assignto_16x16, true);
                gm.GridMenu.AddMenu("Nebim'e manuel aktarıldı", ManuelAktar, Resources.addfooter_16x16, true);
            }
            else
                gvMaster.MakeColumnInvisible("NebimeAktarilma");

            if (WhoAmI == 1 || WhoAmI == 2)
            {
                //gm.GridMenu.AddMenu("Fatura İncele", FaturaIncele, Resources.forcetesting_16x16, true);
                gm.GridMenu.AddMenu("Tüm e-fatura mükelleflerini sorgula", eFaturaMukellefiSorgula, Resources.forcetesting_16x16, true);
                gm.GridMenu.AddMenu("Toplu İndir", FaturaTopluIndir, Resources.forcetesting_16x16);
            }

            if (WhoAmI == 12)
            {
                gm.GridMenu.AddMenu("Toplu Onayla", FaturaOnaylaToplu, Resources.apply_16x16);
                gm.GridMenu.AddMenu("Toplu İndir", FaturaTopluIndir, Resources.forcetesting_16x16);
            }



            //TODO:
            //1. KDV dışında bir vergi kalemi varsa -ötv gibi- uyarı ver.
            //2. 5 taneden fazla kdv oranı varsa uyarı ver
            //3. gelen e-fatura kontrol hata verince, tekrar denenmeli !!!

            gvMaster.YanYanaGetir("Cevap:FaturaOnay");
            gvMaster.YanYanaGetir("Aciklama:FaturaOnay");
            gvMaster.OptionsView.ShowFilterPanelMode = ShowFilterPanelMode.Never;
            gvDetail.SetViewCaption("Fatura Detayı");
            gvMaster.BestFitColumns();
            gvDetail.BestFitColumns();
            gvMaster.Columns["Notlar"].Width = gvMaster.Columns["Aciklama"].Width = 200;

            if (WhoAmI == 12)
            {
                gvMaster.YanYanaGetirCoklu("PayFlexAlinanTarih", "MasrafMerkezi", "Cevap", "FaturaTarihi", "Gonderen", "eFaturaNo", "OdenecekTutar", "ParaBirimi", "Aciklama", "GonderenAdres");
                gvMaster.Columns["SirketId"].Visible = true;
            }

            gvMaster.FocusedRowChanged += gvMaster_FocusedRowChanged;
            gvMaster.RowStyle += gvMaster_RowStyle;
            gvMaster.RowCellClick += gvFatura_RowCellClick;
            gvMaster.MouseMove += gvFatura_MouseMove;
            gvMaster.RowCellStyle += gvMaster_RowCellStyle;

            gvDetail.RowCellStyle += gvDetail_RowCellStyle;
            gvMaster.CellValueChanged += gvMaster_CellValueChanged;

            LoadLayout();

        }


        private void FaturaTopluIndir(object sender, EventArgs e)
        {

            if (gvMaster.SelectedRowsCount == 0 && gvMaster.FocusedRowHandle < 0)
            {
                ShowError("Lütfen indirmek istediğiniz faturaları seçin");
                return;
            }

            FolderBrowserDialog fbd = new FolderBrowserDialog();
            DialogResult result = fbd.ShowDialog();

            string path = fbd.SelectedPath;

            foreach (int rowhandle in gvMaster.GetSelectedRows())
            {
                string urlAddress = gvMaster.GetRowCellValue(rowhandle, "URL").ToString();
                string efaturano = gvMaster.GetRowCellValue(rowhandle, "eFaturaNo").ToString();

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlAddress);
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                if (response.StatusCode == HttpStatusCode.OK)
                {
                    Stream receiveStream = response.GetResponseStream();
                    StreamReader readStream = null;

                    if (response.CharacterSet == null)
                    {
                        readStream = new StreamReader(receiveStream);
                    }
                    else
                    {
                        readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));
                    }

                    string data = readStream.ReadToEnd();

                    response.Close();
                    readStream.Close();

                    SimplePechkin sc = new SimplePechkin(new GlobalConfig().SetMargins(new Margins(150, 150, 50, 50))
                   .SetDocumentTitle("efaturano")
                   .SetCopyCount(1)
                   .SetImageQuality(100)
                   .SetLosslessCompression(true)
                   .SetMaxImageDpi(-1)
                   .SetOutlineGeneration(true)
                   .SetOutputDpi(1200)
                   .SetPaperOrientation(true)
                   .SetPaperSize(PaperKind.Letter)
                   );

                    byte[] buf = sc.Convert(new ObjectConfig(), data);

                    string fn = path + "\\" + efaturano + ".pdf";

                    FileStream fs = new FileStream(fn, FileMode.Create);
                    fs.Write(buf, 0, buf.Length);
                    fs.Close();

                    //Process myProcess = new Process();
                    //myProcess.StartInfo.FileName = fn;
                    //myProcess.Start();

                }
            }

            XtraMessageBox.Show("İndirme işlemi tamamlandı");
        }

        private void SaveAsPDF(string Text)
        {
            SimplePechkin sc = new SimplePechkin(new GlobalConfig().SetMargins(new Margins(150, 150, 50, 50))
               .SetDocumentTitle("e-Fatura")
               .SetCopyCount(1)
               .SetImageQuality(100)
               .SetLosslessCompression(true)
               .SetMaxImageDpi(-1)
               .SetOutlineGeneration(true)
               .SetOutputDpi(1200)
               .SetPaperOrientation(true)
               .SetPaperSize(PaperKind.Letter)
               );

            byte[] buf = sc.Convert(new ObjectConfig(), Text);

            string fn = Utility.FileManager.SaveFile("PDF", "*.PDF|PDF");
            int n = fn.LastIndexOf(".") + 1;
            if (n > 0)
            {
                if (fn.Substring(n, fn.Length - n) != "pdf")
                    fn = fn + ".pdf";
            }
            else
                fn = fn + ".pdf";

            FileStream fs = new FileStream(fn, FileMode.Create);
            fs.Write(buf, 0, buf.Length);
            fs.Close();

            Process myProcess = new Process();
            myProcess.StartInfo.FileName = fn;
            myProcess.Start();
        }

        private void ManuelAktar(object sender, EventArgs e)
        {
            if (gvMaster.FocusedRowHandle > -1)
            {
                int nStokFisiId = gvMaster.GetFocusedRowCellValue("nStokFisiId").ToIntNN();
                if (nStokFisiId > -1)
                {
                    ShowError("Seçtiğiniz fatura Nebim'e zaten aktarılmış. İşlem gerçekleştirilmeyecektir. ");
                    return;
                }
                else
                {
                    Kaydet();

                    int gelenEFaturaId = gvMaster.GetFocusedRowCellValue("GelenEFaturaId").ToIntNN();
                    if (XtraMessageBox.Show("Seçtiğiniz fatura MUHASEBEYE AKTARILANLAR başlığı altına taşınacak. Emin misiniz ?", "Critical", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No)
                        return;
                    AppSession.DataManager.ExecuteNonQuery("UpdnStokFisi", gelenEFaturaId);
                    Yenile();
                }
            }
        }

        void gvMaster_CellValueChanged(object sender, CellValueChangedEventArgs e)
        {
            if (e.Column.FieldName == "MasrafMerkezi")
            {
                Kaydet();
            }
        }

        private void FaturaOnaylaToplu(object sender, EventArgs e)
        {
            string PayflexIds = gvMaster.GetColumnValues("PayFlexId");
            if (XtraMessageBox.Show("Seçilen faturaların hepsi onaylanacaktır. Emin misin ?", "Critical", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No)
                return;
            AppSession.DataManager.ExecuteNonQuery("UpdCevapToplu", PayflexIds, "E", WhoAmI);

            Yenile();
        }


        private void eFaturaMukellefiSorgula(object sender, EventArgs e)
        {
            XtraMessageBox.Show("e-Fatura mükelleflerinin güncellenmesi gerekiyor. Lütfen bu sırada programı kapatmadan bekleyin", "Uyarı", MessageBoxButtons.OK, MessageBoxIcon.Information);
            this.Cursor = Cursors.WaitCursor;
            fatura.TumEFaturaMukellefGuncelle();
            this.Cursor = Cursors.Default;
        }

        private void FaturaIncele(object sender, EventArgs e)
        {
            long PayFlexId = (long)gvMaster.GetFocusedRowCellValue("PayFlexId").ToIntZero();
            fatura.GelenFaturaSorgula(PayFlexId);
        }

        void gvMaster_RowStyle(object sender, RowStyleEventArgs e)
        {
            if (e.RowHandle > -1)
            {
                DateTime today = DateTime.Today;
                DateTime fatura = Convert.ToDateTime(gvMaster.GetRowCellValue(e.RowHandle, "KayitTarihi"));

                if (fatura > today)
                    e.Appearance.BackColor = Color.LightBlue;
                if (ModifiedRows.Contains(e.RowHandle))
                    e.Appearance.BackColor = Color.LightGoldenrodYellow;
            }
        }

        void gvMaster_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e)
        {

            if (gvMaster.FocusedRowHandle > -1)
            {
                int StokFisiId = gvMaster.GetFocusedRowCellValue("nStokFisiId").ToIntZero();

                if (StokFisiId > 0)
                    gvMaster.MakeReadOnly("DovizKuru", "DovizCinsi");
                else
                    gvMaster.MakeReadOnly("DovizKuru", "DovizCinsi", "nFirmaId", "MasrafMerkezi");

                //bool CurrencyRevisable = (bool)gvMaster.GetFocusedRowCellValue("CurrencyRevisable");
                //if (CurrencyRevisable)
                //    gvMaster.MakeReadOnly("DovizKuru", "DovizCinsi", "nFirmaId","MasrafMerkezi");
                //else
                //    gvMaster.MakeReadOnly("nFirmaId");
            }
            gvDetail.BestFitColumns();
        }

        private void RefreshFilter(DataTable dt)
        {
            if (FaturaDurum == "Tümü")
            {
                gvMaster.ActiveFilterString = "";
            }
            else
            {
                bool yeni = FaturaDurum == "Yeni";

                string filters = "[Yeni] =  " + yeni.ToString() + " OR [GelenEFaturaId] In (";

                foreach (DataRow dr in dt.Rows)
                {
                    if ((bool)dr["Yeni"] == yeni)
                        filters += "'" + dr["GelenEFaturaId"].ToStringNN() + "',";
                }

                filters = filters.RemoveIfEndsWith(",") + ")";

                gvMaster.ActiveFilterString = filters;
            }
        }

        private void gvDetail_RowCellStyle(object sender, RowCellStyleEventArgs e)
        {
            if (e.RowHandle > -1)
            {
                if (e.Column.FieldName == "nStokId")
                {
                    int nStokId = gvDetail.GetRowCellValue(e.RowHandle, "nStokId").ToIntZero();
                    if (nStokId == 0)
                        e.Appearance.BackColor = ZorunluRenk;
                }
            }
        }

        Color ZorunluRenk;
        Color HizmetFaturasiRengi;

        private void gvMaster_RowCellStyle(object sender, RowCellStyleEventArgs e)
        {
            if (e.RowHandle > -1)
            {
                if (e.Column.FieldName == "nFirmaId")
                {
                    int nFirmaId = gvMaster.GetRowCellValue(e.RowHandle, "nFirmaId").ToIntZero();
                    if (nFirmaId == 0)
                        e.Appearance.BackColor = ZorunluRenk;
                }
                else if (e.Column.FieldName == "eFaturaNo")
                {
                    if (e.CellValue.ToStringNN() != "")
                    {
                        e.Appearance.Font = new Font(e.Appearance.Font, FontStyle.Underline);
                        e.Appearance.ForeColor = Color.Navy;
                    }
                }
                else if (e.Column.FieldName == "HizmetFaturasi")
                {
                    e.Appearance.BackColor = HizmetFaturasiRengi;
                }
                else if (e.Column.FieldName == "FaturaOnay")
                {
                    int senaryo = gvMaster.GetRowCellValue(e.RowHandle, "ProfileId").ToIntZero();
                    if (senaryo == 2 && e.CellValue.ToStringNN() == "")
                        e.Appearance.BackColor = HizmetFaturasiRengi;
                }
                else if (e.Column.FieldName == "Cevap")
                {
                    if (e.CellValue.ToStringNN() != "")
                    {
                        e.Appearance.Font = new Font(e.Appearance.Font, FontStyle.Underline);
                        e.Appearance.ForeColor = Color.Navy;
                    }
                }
                else if (e.Column.FieldName == "MasrafMerkezi")
                {
                    string MasrafMerkezi = gvMaster.GetRowCellValue(e.RowHandle, "MasrafMerkezi").ToStringNN();
                    if (MasrafMerkezi != "")
                    {
                        DataRow[] dr = dtMasrafMerkezi.Select("MasrafYontemi='" + MasrafMerkezi.Replace("'", "''") + "'");
                        if (dr.Length > 0)
                            e.Appearance.BackColor = Color.GreenYellow;
                        else
                            e.Appearance.BackColor = Color.Pink;
                    }
                }
            }
        }

        private void ShowError(string message)
        {
            XtraMessageBox.Show(message, "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        private void NebimeAktar(object sender, EventArgs e)
        {
            if (gvMaster.FocusedRowHandle > -1)
            {
                Kaydet();

                string PayFlexIds = gvMaster.GetColumnValues("PayFlexId");
                int RowCount = gvMaster.DataTable().Select(string.Format("PayFlexId in ({0})", PayFlexIds)).Length;
                int SentRowCount = gvMaster.DataTable().Select(string.Format("PayFlexId in ({0}) and nStokFisiId is not null", PayFlexIds)).Length;
                int FirmasizRowCount = gvMaster.DataTable().Select(string.Format("PayFlexId in ({0}) and nFirmaId is null", PayFlexIds)).Length;
                int KartsizRowCount = gvDetail.DataTable().Select(string.Format("PayFlexId in ({0}) and nStokId is null", PayFlexIds)).Length;
                int TicariCount = gvMaster.DataTable().Select(string.Format("PayFlexId in ({0}) and ProfileId = 2 and (Isnull(FaturaOnay,0) <> 1 or Isnull(ResponseStatus,-1) <> 0 )  ", PayFlexIds)).Length;

                if (SentRowCount > 0)
                    ShowError(string.Format("Seçilen faturaların {0} tanesi zaten Nebim'e aktarılmış. Lütfen Nebime aktarılmamış faturaları seçin.", SentRowCount));
                else if (FirmasizRowCount > 0)
                    ShowError(string.Format("Seçilen faturaların {0} tanesinde cari seçili değil. Lütfen 'Nebim Firma' alanlarını doldurun.", FirmasizRowCount));
                else if (KartsizRowCount > 0)
                    ShowError(string.Format("Seçilen faturalardaki {0} fatura kaleminde stok kartı seçili değil. Lütfen 'Nebim Stok Kartı' alanlarını doldurun.", KartsizRowCount));
                else if (TicariCount > 0)
                    ShowError(string.Format("Nebim'e aktarılacak TİCARİ faturaların onaylanmış olması gerekir. Seçilen faturaların {0} tanesi onaylanmamış.", TicariCount));
                else
                {
                    foreach (int rowhandle in gvMaster.GetSelectedRows())
                    {
                        int GelenEFaturaId = gvMaster.GetRowCellValue(rowhandle, "GelenEFaturaId").ToIntZero();

                        bool HizmetFaturasi = false;
                        bool.TryParse(gvMaster.GetRowCellValue(rowhandle, "HizmetFaturasi").ToStringNN(), out HizmetFaturasi);

                        bool Proje = false;
                        bool.TryParse(gvMaster.GetRowCellValue(rowhandle, "Proje").ToStringNN(), out Proje);
                        int nStokFisiId;

                        //DataSet dsFa = AppSession.DataManager.ExecuteDataSet("NebimeGonderDeneme", GelenEFaturaId, SirketId, Proje);
                        //return;

                        if (HizmetFaturasi)
                        {
                            if (SirketId == 1) // || SirketId == 2
                            {
                                ShowError("Bu firmalar için hizmet alış faturası tanımlı değil.");
                                return;
                            }
                            else
                                nStokFisiId = AppSession.DataManager.ExecuteScalar(Schema + "NebimeGonderHizmet", GelenEFaturaId, SirketId, Proje).ToIntZero();

                        }

                        else
                            nStokFisiId = AppSession.DataManager.ExecuteNonQuery(Schema + "NebimeGonder", GelenEFaturaId, SirketId, Proje).ToIntZero();
                    }

                    VeriyiGuncelle();
                    ModifiedRows.Add(gvMaster.FocusedRowHandle);
                }
            }
        }

        private void FaturaReddet(object sender, EventArgs e)
        {
            TicariOnay(false);
        }

        private void TicariOnay(bool onay)
        {
            int onayId = 1;
            if (onay == false)
                onayId = 2;

            DateTime FaturaTarihi = Convert.ToDateTime(gvMaster.GetFocusedRowCellValue("FaturaTarihi"));
            DateTime Bugun = DateTime.Now.Date;
            double GunFark = (Bugun - FaturaTarihi).TotalDays;
            long PayFlexId = (long)gvMaster.GetFocusedRowCellValue("PayFlexId").ToIntZero();
            int Senaryo = gvMaster.GetFocusedRowCellValue("ProfileId").ToIntZero();

            int faturaOnay = gvMaster.GetFocusedRowCellValue("ResponseStatus").ToIntNN();

            if (faturaOnay == 0)
            {
                ShowError("Bu fatura daha önce yanıtlanmış!");
                return;
            }
            if (Senaryo != 2)
            {
                ShowError("Bu fatura TİCARİ fatura değil!");
                return;
            }
            else if (PayFlexId < 1)
            {
                ShowError("PayFlexId hatalı!");
                return;
            }
            else if (GunFark >= 8)
            {
                if (XtraMessageBox.Show("Fatura tarihinden itibaren 8 gün geçtiği için onay/red işlemi yapılamaz. Onaylandı olarak işaretlensin mi ?", "Critical", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No)
                    return;
                else
                {
                    AppSession.DataManager.ExecuteNonQuery("UpdTicariFaturaOnay", PayFlexId);
                    ModifiedRows.Add(gvMaster.FocusedRowHandle);
                    VeriyiGuncelle();
                }
            }
            else
            {
                fatura.TicariFaturaYanitla(PayFlexId, onayId);
                ModifiedRows.Add(gvMaster.FocusedRowHandle);
                VeriyiGuncelle();
            }
        }

        private void FaturaOnayla(object sender, EventArgs e)
        {
            TicariOnay(true);
        }

        private void SorumluAta(object sender, EventArgs e)
        {
            int PayFlexId = gvMaster.GetFocusedRowCellValue("PayFlexId").ToIntZero();
            string efaturaNo = gvMaster.GetFocusedRowCellValue("eFaturaNo").ToStringNN();

            if (efaturaNo != "")
            {
                string cevap = gvMaster.GetFocusedRowCellValue("Cevap").ToStringNN();

                if (cevap == "E" || cevap == "H")
                    XtraMessageBox.Show("Bu fatura onay verilmiş ya da reddedilmiş.", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information);
                else
                {
                    SorumluAta atama = new SorumluAta(PayFlexId);
                    if (atama.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        gvMaster.SetFocusedRowCellValue("Cevap", "?");
                        ModifiedRows.Add(gvMaster.FocusedRowHandle);
                    }
                }
            }
        }

        private void Kaydet()
        {
            EndGridViewEdit(gvMaster);
            EndGridViewEdit(gvDetail);
            DataTable dtMaster = gvMaster.DataTable().GetChanges();
            if (dtMaster != null && dtMaster.Rows.Count > 0)
                gvMaster.Update("GelenEFaturaId,nFirmaId,nStokFisiId,HizmetFaturasi,Proje,DovizKuru,DovizCinsi,MasrafMerkezi", "GelenEFatura");

            gvDetail.Update("GelenEFaturaLinesId,nStokId", "GelenEFaturaLines");
        }

        private void gvFatura_MouseMove(object sender, MouseEventArgs e)
        {
            GridView view = sender as GridView;
            GridHitInfo info = view.CalcHitInfo(new Point(e.X, e.Y));

            if (info.InRowCell && info.RowHandle > -1)
            {
                if (info.Column.FieldName == "eFaturaNo")
                {
                    string faturaNo = view.GetRowCellValue(info.RowHandle, "eFaturaNo").ToStringNN();
                    if (faturaNo != "")
                        view.GridControl.Cursor = Cursors.Hand;
                    else
                        view.GridControl.Cursor = Cursors.Default;
                }
                else if (info.Column.FieldName == "Cevap")
                {
                    string cevap = view.GetRowCellValue(info.RowHandle, "Cevap").ToStringNN();
                    if (cevap != "")
                        view.GridControl.Cursor = Cursors.Hand;
                    else
                        view.GridControl.Cursor = Cursors.Default;
                }
            }
            else
                view.GridControl.Cursor = Cursors.Default;

        }

        private void gvFatura_RowCellClick(object sender, RowCellClickEventArgs e)
        {
            if (e.RowHandle < 0)
                return;

            switch (e.Column.FieldName)
            {
                case "eFaturaNo":
                    DataRow dr = gvMaster.GetFocusedDataRow();
                    string url = dr["URL"].ToString();
                    string masrafMerkezi = dr["MasrafMerkezi"].ToStringNN();
                    if (url != "")
                    {
                        FaturaViewer viewer = new FaturaViewer(url, masrafMerkezi);
                        viewer.ShowDialog();
                    }
                    break;
                case "HizmetFaturasi":
                    if (isYonetici || WhoAmI == 34)
                    {
                        bool status = (bool)gvMaster.GetFocusedRowCellValue("HizmetFaturasi");
                        gvMaster.SetFocusedRowCellValue("HizmetFaturasi", !status);
                        gvMaster.CloseEditor();
                        gvMaster.UpdateCurrentRow();
                        Kaydet();
                    }
                    break;
                case "Proje":
                    if (isYonetici || WhoAmI == 34)
                    {
                        bool status = (bool)gvMaster.GetFocusedRowCellValue("Proje");
                        gvMaster.SetFocusedRowCellValue("Proje", !status);
                        gvMaster.CloseEditor();
                        gvMaster.UpdateCurrentRow();
                        Kaydet();
                    }
                    break;
                case "Cevap":
                    int PayFlexId = gvMaster.GetFocusedRowCellValue("PayFlexId").ToIntZero();
                    string cevap = gvMaster.GetFocusedRowCellValue("Cevap").ToString();
                    //if (PayFlexId > 0 && cevap != "")
                    if (cevap != "")
                    {
                        Cevap cvp = new Cevap(PayFlexId, cevap);
                        if (cvp.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                        {
                            //gvMaster.SetFocusedRowCellValue("Cevap", cvp.Answer);
                            VeriyiGuncelle();
                            ModifiedRows.Add(gvMaster.FocusedRowHandle);
                        }
                    }
                    break;
            }
        }

        private DataTable VeriyiGuncelle()
        {
            gvMaster.FocusedRowChanged -= gvMaster_FocusedRowChanged;
            int gelenEFaturaId = gvMaster.GetFocusedRowCellValue("GelenEFaturaId").ToIntNN();

            DataSet ds = AppSession.DataManager.ExecuteDataSet(Schema + "GetGelenEFatura", AppSession.UserInfo.UserId, SirketId, dtBaslangic.EditValue, dtBitis.EditValue);
            gvMaster.VeriyiGuncelle(ds.Tables[0]);
            gvDetail.VeriyiGuncelle(ds.Tables[1]);

            if (ds.Tables[2] != null)
                dtMasrafMerkezi = ds.Tables[2];

            gvMaster.BestFitColumns();
            gvMaster.Columns["Notlar"].Width = gvMaster.Columns["Aciklama"].Width = 200;

            gvMaster.FocusedRowChanged += gvMaster_FocusedRowChanged;

            gvMaster.FocusedRowHandle = gvMaster.LocateByValue(0, gvMaster.Columns["GelenEFaturaId"], gelenEFaturaId);
            return ds.Tables[0];
        }

        private void btnYenile_ItemClick(object sender, ItemClickEventArgs e)
        {
            Yenile();
        }

        private void Yenile()
        {
            //Kaydet();
            DataTable dt = VeriyiGuncelle();

            ModifiedRows.Clear();
            RefreshFilter(dt);

            AppSession.MainForm.InitDagilim();
        }

        private void bbiSorgula_ItemClick(object sender, ItemClickEventArgs e)
        {
            this.Cursor = Cursors.WaitCursor;

            int eklenen = -1;
            int toplamEklenen = 0;

            while (eklenen != 0)
            {
                eklenen = fatura.GelenFaturaSorgula().Tables[0].Rows.Count;
                toplamEklenen += eklenen;
            }

            if (toplamEklenen > 0)
            {
                XtraMessageBox.Show(toplamEklenen.ToString() + " yeni fatura listeye eklendi.", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information);
                Yenile();
            }
            else
                XtraMessageBox.Show("Gelen yeni fatura yok.", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information);

            this.Cursor = Cursors.Default;
        }








        private void ExceleAktar(object sender, EventArgs e)
        {
            List<int> ids = new List<int>();
            DataTable dtResult = new DataTable();
            foreach (int rowhandle in gvMaster.GetSelectedRows())
            {
                ids.Add(gvMaster.GetRowCellValue(rowhandle, "GelenEFaturaId").ToIntZero());

                long PayFlexId = Convert.ToInt64(gvMaster.GetRowCellValue(rowhandle, "PayFlexId"));
                DataSet dsPayflex = fatura.GelenFaturaSorgula(PayFlexId);

                DataRow drPFHeader = dsPayflex.Tables[0].Rows[0];

                DataTable dtPFDetail = dsPayflex.Tables[1];

                dtPFDetail.Columns.Add("EfaturaNo", typeof(string));

                for (int i = 0; i < dtPFDetail.Rows.Count; i++)
                {
                    DataRow drPF = dtPFDetail.Rows[i];
                    DataRow drCU = ds.Tables[1].Select("PayFlexId =" + PayFlexId.ToStringNN())[i];

                    drPF["EfaturaNo"] = drPFHeader["EfaturaNo"];

                    var a = drPF["MalHizmetTutari"].ToIntNN();
                    var b = drCU["MalHizmetTutari"].ToIntNN();

                    if (a == b)
                        drCU["Aciklama"] = drPF["Aciklama"];
                    else
                        throw new ApplicationException("Eşleşme hatası !");
                }

                dtResult.Merge(dtPFDetail);
            }

            DevExpress.XtraGrid.GridControl g = new DevExpress.XtraGrid.GridControl();
            GridView gvv = new GridView();
            g.BindingContext = new System.Windows.Forms.BindingContext();
            g.DataSource = dtResult;
            g.MainView = gvv;
            g.ForceInitialize();
            gvv.GridControl = g;
            gvv.PopulateColumns();
            gvv.OptionsView.ColumnAutoWidth = true;
            gvv.BestFitMaxRowCount = -1;
            gvv.BestFitColumns();
            string path = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache) + "\\ef_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
            g.ExportToXlsx(path);
            System.Diagnostics.Process.Start(path);




        }

        private void btnDuzenKaydet_ItemClick(object sender, ItemClickEventArgs e)
        {
            List<string> pairs = new List<string>();
            for (int i = 0; i < gvMaster.VisibleColumns.Count; i++)
            {
                GridColumn col = gvMaster.VisibleColumns[i];
                string pair = col.FieldName + ":" + i.ToString() + ":" + col.Width;
                pairs.Add(pair);
            }
            string result = String.Join(",", pairs);
            AppSession.Ayar.GelenFaturaMaster = result;

            pairs.Clear();
            for (int i = 0; i < gvDetail.VisibleColumns.Count; i++)
            {
                GridColumn col = gvDetail.VisibleColumns[i];
                string pair = col.FieldName + ":" + i.ToString() + ":" + col.Width;
                pairs.Add(pair);
            }
            result = String.Join(",", pairs);
            AppSession.Ayar.GelenFaturaDetail = result;

            AppSession.Ayar.Save();
            XtraMessageBox.Show("Sütunların sırası, görünürlüğü ve genişliği kaydedildi. Form, artık sizin için bu şekilde açılacak.", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void LoadLayout()
        {
            this.Cursor = Cursors.WaitCursor;

            if (AppSession.Ayar.GelenFaturaMaster != "")
            {
                foreach (GridColumn gc in gvMaster.Columns)
                    gc.Visible = false;

                foreach (string pair in AppSession.Ayar.GelenFaturaMaster.Split(",".ToCharArray()))
                {
                    try
                    {
                        string[] vals = pair.Split(":".ToCharArray());
                        string colName = vals[0];
                        int index = vals[1].ToIntNN();
                        int width = vals[2].ToIntNN();
                        gvMaster.Columns[colName].VisibleIndex = index;
                        gvMaster.Columns[colName].Width = width;
                    }
                    catch
                    {
                        XtraMessageBox.Show("Sütun değişiklikleri olduğu için sütunları yeniden düzenlemelisiniz.", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        foreach (GridColumn gc in gvMaster.Columns)
                            gc.Visible = true;

                        AppSession.Ayar.GelenFaturaMaster = "";
                    }
                }
            }

            if (AppSession.Ayar.GelenFaturaDetail != "")
            {
                foreach (GridColumn gc in gvDetail.Columns)
                    gc.Visible = false;

                foreach (string pair in AppSession.Ayar.GelenFaturaDetail.Split(",".ToCharArray()))
                {
                    try
                    {
                        string[] vals = pair.Split(":".ToCharArray());
                        string colName = vals[0];
                        int index = vals[1].ToIntNN();
                        int width = vals[2].ToIntNN();
                        gvDetail.Columns[colName].VisibleIndex = index;
                        gvDetail.Columns[colName].Width = width;
                    }
                    catch
                    {
                        XtraMessageBox.Show("Sütun değişiklikleri olduğu için sütunları yeniden düzenlemelisiniz.", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        foreach (DevExpress.XtraGrid.Columns.GridColumn gc in gvDetail.Columns)
                            gc.Visible = true;

                        AppSession.Ayar.GelenFaturaDetail = "";
                    }
                }
            }

            AppSession.Ayar.Save();
            this.Cursor = Cursors.Default;
        }
    }
}